package br.ucb.tcc.beans;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import twitter4j.GeoLocation;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import br.ucb.tcc.dto.PerfilDTO;
import br.ucb.tcc.persistencia.PerfilDAO;
import br.ucb.tcc.utils.Constantes;
import br.ucb.tcc.utils.StringUtil;

public class TwitterBean {

	public Twitter twitter;
	public PerfilDTO perfilDTO;
	public String buscarPorNome;
	public String twittar;
	public String buscarPorAssunto;
	public PerfilDAO dao = new PerfilDAO();

	public List<String> relacoes = new ArrayList<String>();
	public List<PerfilDTO> perfisPesquisados = new ArrayList<PerfilDTO>();

	
	public TwitterBean() {
		// TODO Auto-generated constructor stub
	}
	
	
	public void autentica() {

		ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
		configurationBuilder.setOAuthConsumerKey(Constantes.CONSUMER_KEY);
		configurationBuilder
				.setOAuthConsumerSecret(Constantes.CONSUMER_KEY_SECRET);
		configurationBuilder
				.setOAuthAccessToken(Constantes.CONSUMER_ACESS_TOKEN);
		configurationBuilder
				.setOAuthAccessTokenSecret(Constantes.CONSUMER_ACESS_TOKEN_SECRET);

		Configuration configuration = configurationBuilder.build();

		try {
			AccessToken accessToken = getTwitter(configuration)
					.getOAuthAccessToken();
			String token = accessToken.getToken();
			String tokenSecret = accessToken.getTokenSecret();

			if (token == null || tokenSecret == null) {
				return;
			}
		} catch (TwitterException e) {
			e.printStackTrace();
			return;
		}
		System.out.println("Autenticou!");
	}

	public Twitter getTwitter(Configuration conf) {
		if (twitter == null) {
			twitter = new TwitterFactory(conf).getInstance();
		}
		return twitter;
	}

	public String enviarMensagem() {
		try {
			Status updateStatus = twitter.updateStatus(twittar);
			System.out.println("Texto Enviado:" + updateStatus.getText());
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return "/index.faces";
	}

	public List<Tweet> getTweetsPorAssunto() {
		List<Tweet> tweets = null;
		try {
			Query query = new Query(buscarPorAssunto);
			QueryResult queryResult = twitter.search(query);
			tweets = queryResult.getTweets();

		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return tweets;
	}

	public List<Status> getListaStatus() {
		try {
			return twitter.getFriendsTimeline();
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return new ArrayList<Status>();
	}

	public String buscarInformacoesPorDeterminadoNome() {
		try {
			User user = null;
			if (buscarPorNome != null && !buscarPorNome.equals("")) {
				user = twitter.showUser(buscarPorNome);
			} else {
				user = twitter.showUser("italoricci");
			}
			setarInformacoesDTO(user);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return "/index.faces";
	}

	public void setarInformacoesDTO(User user) {
		perfilDTO = new PerfilDTO();
		perfilDTO.setNomePerfil(user.getName());
		perfilDTO.setNomeExibicao(user.getScreenName());
		perfilDTO.setUltimoPost(user.getStatus().getText());
	}

	public List<Tweet> buscarTwitterPorAssunto(String assunto) {
		List<Tweet> tweets = null;
		try {
			Query query = new Query(assunto);
			QueryResult queryResult = twitter.search(query);
			query.setPage(4);
			tweets = queryResult.getTweets();
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return tweets;
	}

	public List<Tweet> buscarTwitterPorAssuntoPorLocalizacao(String assunto,
			Double latitude, Double longintude, Double raio,
			String unidadeMedida) {
		List<Tweet> tweets = null;
		try {
			Query query = new Query(assunto);
			query.setGeoCode(new GeoLocation(latitude, longintude), raio,
					unidadeMedida);
			QueryResult queryResult = twitter.search(query);

			tweets = queryResult.getTweets();

		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return tweets;
	}

	public User obterUsuarioPeloNome(String screenNameUsuario) {
		try {
			return twitter.showUser(screenNameUsuario);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return null;
	}

	public User obterUsuarioPeloId(Integer userId) {
		try {
			return twitter.showUser(userId);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return null;
	}

	public ResponseList<User> obterUsuarioPorQuery(String query) {
		try {
			return twitter.searchUsers(query, 10);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return null;
	}

	public PerfilDTO montarPerfilDTO(Tweet tweet) {
		PerfilDTO perfilDTO = null;
		try {
			perfilDTO = montarPerfilDTO(twitter.showUser(tweet.getFromUserId()));
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		return perfilDTO;
	}

	public PerfilDTO montarPerfilDTO(User user) {
		PerfilDTO dto = new PerfilDTO();
		dto.setId(user.getId());
		dto.setLocalizacao(user.getLocation());
		dto.setCorFundo(user.getProfileBackgroundColor());
		dto.setDescricaoPerfil(user.getDescription());
		dto.setCorLink(user.getProfileLinkColor());
		dto.setNomeExibicao(user.getScreenName());
		dto.setNomePerfil(user.getName());
		dto.setQtdAmigos(user.getFriendsCount());
		dto.setQtdSeguidores(user.getFollowersCount());
		dto.setUltimoPost(user.getStatus().getText());
		dto.setUrlBackground(user.getProfileBackgroundImageUrl());
		dto.setUrlImagem(user.getProfileImageURL().getPath());
		return dto;
	}

	public String pesquisarUsuariosPorAssunto() {
		List<Tweet> buscarTwitterPorAssunto = buscarTwitterPorAssunto(buscarPorAssunto);
		for (Tweet tweet : buscarTwitterPorAssunto) {
			if (tweet.getToUserId() != -1) {
				relacoes.add(tweet.getFromUserId() + "," + tweet.getToUserId());
			} else {
				String obterNomeRT = StringUtil.retornarNomePrincipal(
						tweet.getText(), "@");
				User userRT = obterUsuarioPeloNome("@" + obterNomeRT);
				relacoes.add(tweet.getFromUserId() + "," + userRT.getId());
			}
		}
		return "/index.faces";
	}

	public String inserirRelacoesBanco() {
		if (relacoes != null && !relacoes.isEmpty()) {
			Map<Long, Long> relacoesInserts = new HashMap<Long, Long>();
			for (String rel : relacoes) {
				String[] split = rel.split(",");
				Long origemId = new Long(split[0]);
				Long destinoId = new Long(split[1]);
				relacoesInserts.put(origemId, destinoId);
			}
			dao.inserirRelacoes(relacoesInserts);
		}
		return "/index.faces";
	}

	public void inserirPerfisPesquisados() {

	}

	public PerfilDTO getPerfilDTO() {
		return perfilDTO;
	}

	public void setPerfilDTO(PerfilDTO perfilDTO) {
		this.perfilDTO = perfilDTO;
	}

	public Twitter getTwitter() {
		return twitter;
	}

	public void setTwitter(Twitter twitter) {
		this.twitter = twitter;
	}

	public String getBuscarPorNome() {
		return buscarPorNome;
	}

	public void setBuscarPorNome(String buscarPorNome) {
		this.buscarPorNome = buscarPorNome;
	}

	public String getTwittar() {
		return twittar;
	}

	public void setTwittar(String twittar) {
		this.twittar = twittar;
	}

	public String getBuscarPorAssunto() {
		return buscarPorAssunto;
	}

	public void setBuscarPorAssunto(String buscarPorAssunto) {
		this.buscarPorAssunto = buscarPorAssunto;
	}

	public List<String> getRelacoes() {
		return relacoes;
	}

	public void setRelacoes(List<String> relacoes) {
		this.relacoes = relacoes;
	}

}
